package insta.project;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader.TileMode;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;


public class CoverflowActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.coverflow);
        
        CoverFlow cf = (CoverFlow) findViewById(R.id.cf);
        int[] images = new int[] { R.drawable.i1, R.drawable.i2, R.drawable.i3 };
        cf.setAdapter(new CoverFlowAdapter(images));
    }
    
    private class CoverFlowAdapter extends BaseAdapter {
    	private int[] ressourcesId;
    	
    	public CoverFlowAdapter(int[] ressourcesId) {
    		this.ressourcesId = ressourcesId;
    	}

		public int getCount() {
			return ressourcesId.length;
		}

		public Object getItem(int position) {
			return null;
		}

		public long getItemId(int position) {
			return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
			Context c = CoverflowActivity.this;
			Bitmap input = BitmapFactory.decodeResource(getResources(), ressourcesId[position]);
			Bitmap output = createReflectedImage(c, input);
			ImageView v = new ImageView(c);
			v.setLayoutParams(new Gallery.LayoutParams(output.getWidth(), output.getHeight()));
			v.setScaleType(ScaleType.FIT_XY);
			v.setImageBitmap(output);			
			return v;
		}
		
		private Bitmap createReflectedImage(Context context, Bitmap originalImage) {
			//The gap we want between the reflection and the original image
			final int reflectionGap = 4;
			int width = originalImage.getWidth();
			int height = originalImage.getHeight();

			//This will not scale but will flip on the Y axis
			Matrix matrix = new Matrix();
			matrix.preScale(1, -1);
			  
			//Create a Bitmap with the flip matrix applied to it.
			//We only want the bottom half of the image
			Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0, height/2, width, height/2, matrix, false);

			//Create a new bitmap with same width but taller to fit reflection
			Bitmap bitmapWithReflection = Bitmap.createBitmap(width, (height + height/2), Config.ARGB_8888);
			  
			//Create a new Canvas with the bitmap that's big enough for
			//the image plus gap plus reflection
			Canvas canvas = new Canvas(bitmapWithReflection);
			//Draw in the original image
			canvas.drawBitmap(originalImage, 0, 0, null);
			//Draw in the gap
			Paint defaultPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
			canvas.drawRect(0, height, width, height + reflectionGap, defaultPaint);
			//Draw in the reflection
			canvas.drawBitmap(reflectionImage,0, height + reflectionGap, null);
			 
			//Create a shader that is a linear gradient that covers the reflection
			Paint paint = new Paint();
			LinearGradient shader = new LinearGradient(0, originalImage.getHeight(), 0,
			bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff, 0x00ffffff,
			TileMode.CLAMP);
			//Set the paint to use this shader (linear gradient)
			paint.setShader(shader);
			//Set the Transfer mode to be porter duff and destination in
			paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
			//Draw a rectangle using the paint with our linear gradient
			canvas.drawRect(0, height, width,
			bitmapWithReflection.getHeight() + reflectionGap, paint);
			
			return bitmapWithReflection;
		}
    }
}